<!DOCTYPE html>
<html lang="zh-CN" dir="ltr">
<head><script src="/information/public/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=information/public/livereload" data-no-instant defer></script>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="1.时序图只能表现出一个正常的交互流程，如果涉及到各种状态判断，或者说需要更细节的东西，还得考虑使用泳道活动图（流程图）
2.一个方法里面，如果代码业务逻辑复杂，不仅需要空行来分清代码逻辑，注释来解释代码，最好还是打点日志，方便部署后排查。日志的目的是为了项目部署后方便排查
3.traceId才是正确搜出完整调用链路耗时的方案。如果没有traceId，先通过某关键字搜日志，拿到traceId后再通过traceId来搜
4.一个方法入口记得打印参数，方便排查问题，如定位该方法或者通过以该参数为关键字，找出该条链路的traceId
5.WebRTC传输层协议大多使用UDP
WebSokcet的传输层协议大多使用TCP来实现全双工通信，本质是基于Http建立了一个Tcp连接
6.管理系统最终的本质都是增删改查。一个管理系统，往往是在增删改查的基础上，围绕了大量的复杂业务，增删改查的背后是一系列负责的业务，但是这些业务的结果，最终都会以对数据的增删改查投影在数据库
7.技术是技术，业务是业务，技术应该是通用的，业务的私有的，技术不服务于业务，技术可用于业务，技术与业务是解耦的
8.系统分析流程与公司实践对比
规范系统分析与设计流程（维度是系统） 辅助工具 获取业务用例及分析业务用例场景 业务用例图及泳道活动图（描述用户之间的交互） 提取系统用例及分析系统用例场景 系统用例图及泳道活动图（描述用户与计算机之间的交互） 实现系统用例场景及获取分析类图 时序图与分析类（边界类，实体类，控制类等） 系统架构设计及获取系统用例分析模型 基于架构的时序图及分析类图（边界类，实体类，控制类） 分析模型映射到设计模型 实体类图 接口及包设计 类图 数据模型设计 实体关系图（ERD） 系统实现 代码开发 公司方案模板（需求维度，即系统用例维度） 辅助工具 背景 纯文字描述 目标 纯文字描述 需求分析，确定需求范围（提取系统用例，确定系统用例范围） 纯文字描述（系统用例图） 问题分析（系统用例实现，关键细节的方案处理） 纯文字描述 场景分析（系统用例场景分析） 纯文字描述（活动泳道图） 流程设计（系统用例实现） 时序图（描述前后端或者模块之间的交互图） 异常场景设计 纯文字描述 数据模型设计 SQL语句（或者加上ERD图） 接口设计 接口文档（YAPI） 性能评估 业务影响范围（需求影响范围） 安全性评估 评审意见 一：online-server(SpringBoot项目)：SpringBoot集成netty（服务端），利用kafka解耦业务通信
1.非web环境，只是一个springBoot项目，所以利用countDownLatch来使项目一直处于启动状态。latch不countDown,一直await就可以
2.该SpringBoot项目，通过SpringApplicationBuild的方式构建容器上下文，该方法可自定义多种启动配置，如不需要web环境，是一种更灵活的启动方式。惯用做法是SpringApplication.run（启动类，启动参数），该做法启动一个web项目，项目会一直处于运行状态（启动了Tomcat）。
new SpringApplicationBuilder().web(WebApplicationType.NONE).sources(启动类).args(启动参数) 3.kafka有个专门的消费者订阅netty启动/关闭主题，该消费者控制netty的启动与关闭。（此种设计，使得该项目与netty服务解耦，可以随时关闭/开启netty服务，而不要启动/关闭整个服务）
3.1 另外一种启动方式：Netty启动类实现Spring的InitializingBean，实现其afterPropertiesSet（）方法，在bean初始化完后自动启动(这种方式只能启动，不能停止，除非整个SpringBoot服务挂了)
（一个SpringBoot项目可以启动多个Netty服务）
4.Netty服务端的所有组件都加入spring容器，由spring管理
5.服务器向客户端通信，通过kafka进一步解耦。发送消息的Service为kafak消费者，其他下游服务通过往该topic发送数据，该消费者即会将对应的数据发送到客户端，其他微服务与云机的通信问题
6.服务端收到消息后，通过kafka将消息下发到下游，由对应的微服务进行处理
7.服务端接收到客户端信息后，通过自定义的解码器解码字节数组（字节数组实际就是一串二进制码），自定义的解码器有json解码与gzip解码。前者调用的实际就是FastJsonSerializer.deserialize(byte[])。解码器写死了解码的数据格式，也就是自定义的实体类。编码适配器调用JSON.toJSONByte()将对象转成jons字节数组
这里用了对象适配器模式，遍历存储了解码器的数组，从数组中获取对应的解码适配器，解码适配器再调用对应的对象反序列化数据。实际就是在数据源与解码器之间，加了一层适配器
8.锁获取锁失败有两种方案：通过时间停止获取锁，如超过等待时间就停止获取锁；通过获取次数，如果获取次数超高预期值，则停止获取锁
9.对接第三方平台，向第三方平台发送请求时，需要记录第三方接口的响应时间。可以将调用操作记录入口，记录请求时间，响应时间，花费时间，请求参数等信息，方便排查性能问题">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#ffffff">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#343a40">
<meta name="color-scheme" content="light dark"><meta property="og:title" content="" />
<meta property="og:description" content="1.时序图只能表现出一个正常的交互流程，如果涉及到各种状态判断，或者说需要更细节的东西，还得考虑使用泳道活动图（流程图）
2.一个方法里面，如果代码业务逻辑复杂，不仅需要空行来分清代码逻辑，注释来解释代码，最好还是打点日志，方便部署后排查。日志的目的是为了项目部署后方便排查
3.traceId才是正确搜出完整调用链路耗时的方案。如果没有traceId，先通过某关键字搜日志，拿到traceId后再通过traceId来搜
4.一个方法入口记得打印参数，方便排查问题，如定位该方法或者通过以该参数为关键字，找出该条链路的traceId
5.WebRTC传输层协议大多使用UDP
WebSokcet的传输层协议大多使用TCP来实现全双工通信，本质是基于Http建立了一个Tcp连接
6.管理系统最终的本质都是增删改查。一个管理系统，往往是在增删改查的基础上，围绕了大量的复杂业务，增删改查的背后是一系列负责的业务，但是这些业务的结果，最终都会以对数据的增删改查投影在数据库
7.技术是技术，业务是业务，技术应该是通用的，业务的私有的，技术不服务于业务，技术可用于业务，技术与业务是解耦的
8.系统分析流程与公司实践对比
规范系统分析与设计流程（维度是系统） 辅助工具 获取业务用例及分析业务用例场景 业务用例图及泳道活动图（描述用户之间的交互） 提取系统用例及分析系统用例场景 系统用例图及泳道活动图（描述用户与计算机之间的交互） 实现系统用例场景及获取分析类图 时序图与分析类（边界类，实体类，控制类等） 系统架构设计及获取系统用例分析模型 基于架构的时序图及分析类图（边界类，实体类，控制类） 分析模型映射到设计模型 实体类图 接口及包设计 类图 数据模型设计 实体关系图（ERD） 系统实现 代码开发 公司方案模板（需求维度，即系统用例维度） 辅助工具 背景 纯文字描述 目标 纯文字描述 需求分析，确定需求范围（提取系统用例，确定系统用例范围） 纯文字描述（系统用例图） 问题分析（系统用例实现，关键细节的方案处理） 纯文字描述 场景分析（系统用例场景分析） 纯文字描述（活动泳道图） 流程设计（系统用例实现） 时序图（描述前后端或者模块之间的交互图） 异常场景设计 纯文字描述 数据模型设计 SQL语句（或者加上ERD图） 接口设计 接口文档（YAPI） 性能评估 业务影响范围（需求影响范围） 安全性评估 评审意见 一：online-server(SpringBoot项目)：SpringBoot集成netty（服务端），利用kafka解耦业务通信
1.非web环境，只是一个springBoot项目，所以利用countDownLatch来使项目一直处于启动状态。latch不countDown,一直await就可以
2.该SpringBoot项目，通过SpringApplicationBuild的方式构建容器上下文，该方法可自定义多种启动配置，如不需要web环境，是一种更灵活的启动方式。惯用做法是SpringApplication.run（启动类，启动参数），该做法启动一个web项目，项目会一直处于运行状态（启动了Tomcat）。
new SpringApplicationBuilder().web(WebApplicationType.NONE).sources(启动类).args(启动参数) 3.kafka有个专门的消费者订阅netty启动/关闭主题，该消费者控制netty的启动与关闭。（此种设计，使得该项目与netty服务解耦，可以随时关闭/开启netty服务，而不要启动/关闭整个服务）
3.1 另外一种启动方式：Netty启动类实现Spring的InitializingBean，实现其afterPropertiesSet（）方法，在bean初始化完后自动启动(这种方式只能启动，不能停止，除非整个SpringBoot服务挂了)
（一个SpringBoot项目可以启动多个Netty服务）
4.Netty服务端的所有组件都加入spring容器，由spring管理
5.服务器向客户端通信，通过kafka进一步解耦。发送消息的Service为kafak消费者，其他下游服务通过往该topic发送数据，该消费者即会将对应的数据发送到客户端，其他微服务与云机的通信问题
6.服务端收到消息后，通过kafka将消息下发到下游，由对应的微服务进行处理
7.服务端接收到客户端信息后，通过自定义的解码器解码字节数组（字节数组实际就是一串二进制码），自定义的解码器有json解码与gzip解码。前者调用的实际就是FastJsonSerializer.deserialize(byte[])。解码器写死了解码的数据格式，也就是自定义的实体类。编码适配器调用JSON.toJSONByte()将对象转成jons字节数组
这里用了对象适配器模式，遍历存储了解码器的数组，从数组中获取对应的解码适配器，解码适配器再调用对应的对象反序列化数据。实际就是在数据源与解码器之间，加了一层适配器
8.锁获取锁失败有两种方案：通过时间停止获取锁，如超过等待时间就停止获取锁；通过获取次数，如果获取次数超高预期值，则停止获取锁
9.对接第三方平台，向第三方平台发送请求时，需要记录第三方接口的响应时间。可以将调用操作记录入口，记录请求时间，响应时间，花费时间，请求参数等信息，方便排查性能问题" />
<meta property="og:type" content="article" />
<meta property="og:url" content="http://localhost:1313/information/public/docs/%E9%9A%8F%E6%83%B3/%E6%97%A0%E6%A0%87%E9%A2%98/" /><meta property="article:section" content="docs" />



<title>无标题 | 小白不黑</title>
<link rel="manifest" href="/information/public/manifest.json">
<link rel="icon" href="/information/public/favicon.png" >
<link rel="canonical" href="http://localhost:1313/information/public/docs/%E9%9A%8F%E6%83%B3/%E6%97%A0%E6%A0%87%E9%A2%98/">
<link rel="stylesheet" href="/information/public/book.min.33a48f5432973b8ff9a82679d9e45d67f2c15d4399bd2829269455cfe390b5e8.css" integrity="sha256-M6SPVDKXO4/5qCZ52eRdZ/LBXUOZvSgpJpRVz&#43;OQteg=" crossorigin="anonymous">
  <script defer src="/information/public/flexsearch.min.js"></script>
  <script defer src="/information/public/en.search.min.239bc1aedac4b8ba3042aed3fdae0ee8eaa443ae93f310744c4abf135918c4ec.js" integrity="sha256-I5vBrtrEuLowQq7T/a4O6OqkQ66T8xB0TEq/E1kYxOw=" crossorigin="anonymous"></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
-->
  
</head>
<body dir="ltr">
  <input type="checkbox" class="hidden toggle" id="menu-control" />
  <input type="checkbox" class="hidden toggle" id="toc-control" />
  <main class="container flex">
    <aside class="book-menu">
      <div class="book-menu-content">
        
  <nav>
<h2 class="book-brand">
  <a class="flex align-center" href="/information/public/"><span>小白不黑</span>
  </a>
</h2>


<div class="book-search">
  <input type="text" id="book-search-input" placeholder="Search" aria-label="Search" maxlength="64" data-hotkeys="s/" />
  <div class="book-search-spinner hidden"></div>
  <ul id="book-search-results"></ul>
</div>












  



  
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-e03b8728b131eeace3adaee021fbb6e2" class="toggle"  />
    <label for="section-e03b8728b131eeace3adaee021fbb6e2" class="flex justify-between">
      <a role="button" class="">Jdk原生</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/jdk%E5%8E%9F%E7%94%9F/stream%E6%B5%81%E5%A4%84%E7%90%86/" class="">Stream流处理</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/jdk%E5%8E%9F%E7%94%9F/string/" class="">String</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-e40fdba218cca67a07e9df53082e1218" class="toggle"  />
    <label for="section-e40fdba218cca67a07e9df53082e1218" class="flex justify-between">
      <a role="button" class="">Web服务器</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-274443a256e3797fbf61556d5057d50b" class="toggle"  />
    <label for="section-274443a256e3797fbf61556d5057d50b" class="flex justify-between">
      <a role="button" class="">Nginx</a>
    </label>
  

          
  <ul>
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-17917abd9886b33b949a0bf4d7edc54c" class="toggle"  />
    <label for="section-17917abd9886b33b949a0bf4d7edc54c" class="flex justify-between">
      <a role="button" class="">Tomcat</a>
    </label>
  

          
  <ul>
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-3dfe1030abf564fbadaffac49be0a17f" class="toggle"  />
    <label for="section-3dfe1030abf564fbadaffac49be0a17f" class="flex justify-between">
      <a role="button" class="">云计算</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E4%BA%91%E8%AE%A1%E7%AE%97/%E4%BA%91%E8%AE%A1%E7%AE%97%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/" class="">云计算基本概念</a>
  

        </li>
      
    
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-35ef217d212df8f7f126510047a2ffcd" class="toggle"  />
    <label for="section-35ef217d212df8f7f126510047a2ffcd" class="flex justify-between">
      <a role="button" class="">其他</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%85%B6%E4%BB%96/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/" class="">正则表达式</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-7ddc46bf680b6bb569bc10c6dd5300bb" class="toggle"  />
    <label for="section-7ddc46bf680b6bb569bc10c6dd5300bb" class="flex justify-between">
      <a role="button" class="">安全相关</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-0b06b6466894f0da13f8f36407b21a00" class="toggle"  />
    <label for="section-0b06b6466894f0da13f8f36407b21a00" class="flex justify-between">
      <a role="button" class="">Redos漏洞</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%AE%89%E5%85%A8%E7%9B%B8%E5%85%B3/redos%E6%BC%8F%E6%B4%9E/%E8%AF%B4%E6%98%8E/" class="">说明</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-90325a98074701364880fd0a253c99d5" class="toggle"  />
    <label for="section-90325a98074701364880fd0a253c99d5" class="flex justify-between">
      <a role="button" class="">加密</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%AE%89%E5%85%A8%E7%9B%B8%E5%85%B3/%E5%8A%A0%E5%AF%86/md5/" class="">Md5</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-d1da7c8c3cf353ba4d0cb95ee867d81a" class="toggle"  />
    <label for="section-d1da7c8c3cf353ba4d0cb95ee867d81a" class="flex justify-between">
      <a role="button" class="">日志脱敏</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%AE%89%E5%85%A8%E7%9B%B8%E5%85%B3/%E6%97%A5%E5%BF%97%E8%84%B1%E6%95%8F/%E8%84%B1%E6%95%8F%E6%96%B9%E6%A1%88/" class="">脱敏方案</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-f01c435c76271a7a187f8eeb9d6daa46" class="toggle"  />
    <label for="section-f01c435c76271a7a187f8eeb9d6daa46" class="flex justify-between">
      <a role="button" class="">证书密钥</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%AE%89%E5%85%A8%E7%9B%B8%E5%85%B3/%E8%AF%81%E4%B9%A6%E5%AF%86%E9%92%A5/keytool/" class="">Keytool</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%AE%89%E5%85%A8%E7%9B%B8%E5%85%B3/%E8%AF%81%E4%B9%A6%E5%AF%86%E9%92%A5/%E5%85%B3%E4%BA%8E%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6/" class="">关于数字证书</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-78827b033d230a0c162f465f09a45d34" class="toggle"  />
    <label for="section-78827b033d230a0c162f465f09a45d34" class="flex justify-between">
      <a role="button" class="">微服务</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-9c3c167311c882339be0f2529b4722b9" class="toggle"  />
    <label for="section-9c3c167311c882339be0f2529b4722b9" class="flex justify-between">
      <a role="button" class="">中间件</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-bc5de2dc313f1aaa64d3f3e1d4eb8925" class="toggle"  />
    <label for="section-bc5de2dc313f1aaa64d3f3e1d4eb8925" class="flex justify-between">
      <a role="button" class="">Rpc中间件</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-760e4141db4344053b65d340ff2f3661" class="toggle"  />
    <label for="section-760e4141db4344053b65d340ff2f3661" class="flex justify-between">
      <a role="button" class="">Dubbo</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E4%B8%AD%E9%97%B4%E4%BB%B6/rpc%E4%B8%AD%E9%97%B4%E4%BB%B6/dubbo/dubbo%E6%8B%A6%E6%88%AA%E5%99%A8/" class="">Dubbo拦截器</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-e82ef185891826377b9cd0983696be44" class="toggle"  />
    <label for="section-e82ef185891826377b9cd0983696be44" class="flex justify-between">
      <a role="button" class="">分布式协调服务中间件</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-636027efa9d542b0e89ce07013ac0f04" class="toggle"  />
    <label for="section-636027efa9d542b0e89ce07013ac0f04" class="flex justify-between">
      <a role="button" class="">Zookeeper</a>
    </label>
  

          
  <ul>
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-deb73193e734b23d0a3274f88261dcb8" class="toggle"  />
    <label for="section-deb73193e734b23d0a3274f88261dcb8" class="flex justify-between">
      <a role="button" class="">消息中间件</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-6501196988605bbfffd3ba7ecc37c7ca" class="toggle"  />
    <label for="section-6501196988605bbfffd3ba7ecc37c7ca" class="flex justify-between">
      <a role="button" class="">Kafka</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E4%B8%AD%E9%97%B4%E4%BB%B6/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/kafka/kafka%E6%9E%B6%E6%9E%84%E6%A8%A1%E5%9E%8B/" class="">Kafka架构模型</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E4%B8%AD%E9%97%B4%E4%BB%B6/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/kafka/kafka%E7%9A%84%E6%B6%88%E6%81%AF%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84/" class="">Kafka的消息存储结构</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E4%B8%AD%E9%97%B4%E4%BB%B6/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/kafka/kafka%E7%BB%84%E4%BB%B6%E8%AF%B4%E6%98%8E/" class="">Kafka组件说明</a>
  

        </li>
      
    
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E4%B8%AD%E9%97%B4%E4%BB%B6/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/kafka/%E6%B6%88%E6%81%AF%E5%8F%AF%E9%9D%A0%E6%80%A7%E4%BF%9D%E8%AF%81/" class="">消息可靠性保证</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-c6610ca1dca1f02b4ea2ef58834d3b9e" class="toggle"  />
    <label for="section-c6610ca1dca1f02b4ea2ef58834d3b9e" class="flex justify-between">
      <a role="button" class="">缓存中间件</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-e21697bb560eb834cd67ab4f90b97c01" class="toggle"  />
    <label for="section-e21697bb560eb834cd67ab4f90b97c01" class="flex justify-between">
      <a role="button" class="">Redis</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E4%B8%AD%E9%97%B4%E4%BB%B6/%E7%BC%93%E5%AD%98%E4%B8%AD%E9%97%B4%E4%BB%B6/redis/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" class="">Redis数据结构</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E4%B8%AD%E9%97%B4%E4%BB%B6/%E7%BC%93%E5%AD%98%E4%B8%AD%E9%97%B4%E4%BB%B6/redis/redis%E7%9A%84%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF/" class="">Redis的使用场景</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-5df0e0cacbab4ce1da881f03f4d995d7" class="toggle"  />
    <label for="section-5df0e0cacbab4ce1da881f03f4d995d7" class="flex justify-between">
      <a role="button" class="">微服务架构</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84/%E6%A8%A1%E5%9D%97%E8%AE%BE%E8%AE%A1/" class="">模块设计</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-607dd6f4c673d54dd39e72765ef574d6" class="toggle"  />
    <label for="section-607dd6f4c673d54dd39e72765ef574d6" class="flex justify-between">
      <a role="button" class="">性能</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-4dcd8dcfe08064eb4e3599f6c854acfe" class="toggle"  />
    <label for="section-4dcd8dcfe08064eb4e3599f6c854acfe" class="flex justify-between">
      <a role="button" class="">性能指标</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%80%A7%E8%83%BD/%E6%80%A7%E8%83%BD%E6%8C%87%E6%A0%87/%E6%80%A7%E8%83%BD%E6%8C%87%E6%A0%87/" class="">性能指标</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-c1cb4170f65a623877e16ed1e247a255" class="toggle"  />
    <label for="section-c1cb4170f65a623877e16ed1e247a255" class="flex justify-between">
      <a role="button" class="">操作系统</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-1726a4f2c29014a9b62b8229d726a9c7" class="toggle"  />
    <label for="section-1726a4f2c29014a9b62b8229d726a9c7" class="flex justify-between">
      <a role="button" class="">Linux系统</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/linux%E7%B3%BB%E7%BB%9F/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/" class="">常用命令</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-d6bf821eb6d414043ecca879804a889c" class="toggle"  />
    <label for="section-d6bf821eb6d414043ecca879804a889c" class="flex justify-between">
      <a role="button" class="">Windows系统</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/windows%E7%B3%BB%E7%BB%9F/bat%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/" class="">Bat常用命令</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-7b25a9d57f745dac7025d8935c0dd6d6" class="toggle"  />
    <label for="section-7b25a9d57f745dac7025d8935c0dd6d6" class="flex justify-between">
      <a role="button" class="">安卓系统</a>
    </label>
  

          
  <ul>
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-b6450c19685e6ac9ff6b0b7c5cdd1af0" class="toggle"  />
    <label for="section-b6450c19685e6ac9ff6b0b7c5cdd1af0" class="flex justify-between">
      <a role="button" class="">鸿蒙系统</a>
    </label>
  

          
  <ul>
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-da0cce6ed9e2ebdccdccb46bc84eb6ed" class="toggle"  />
    <label for="section-da0cce6ed9e2ebdccdccb46bc84eb6ed" class="flex justify-between">
      <a role="button" class="">数据库</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-cef3f1dfbcd3958a4bdcd8bddbd9b0e6" class="toggle"  />
    <label for="section-cef3f1dfbcd3958a4bdcd8bddbd9b0e6" class="flex justify-between">
      <a role="button" class="">Mysql</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/mysql/mysql%E4%BC%98%E5%8C%96/" class="">My Sql优化</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/mysql/sql%E5%87%BD%E6%95%B0/" class="">Sql函数</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/mysql/sql%E6%9F%A5%E8%AF%A2/" class="">Sql查询</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/mysql/%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B/" class="">存储过程</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/mysql/%E9%94%81%E7%9B%B8%E5%85%B3/" class="">锁相关</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-caa1421f47d590dafd0cd7ba82594a3e" class="toggle"  />
    <label for="section-caa1421f47d590dafd0cd7ba82594a3e" class="flex justify-between">
      <a role="button" class="">Obs</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/obs/obs%E4%BB%8B%E7%BB%8D/" class="">Obs介绍</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-899ab72702f86e97de2ef9e34b57e6df" class="toggle"  />
    <label for="section-899ab72702f86e97de2ef9e34b57e6df" class="flex justify-between">
      <a role="button" class="">框架</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-844c721eedb146bd96850eabc84ec824" class="toggle"  />
    <label for="section-844c721eedb146bd96850eabc84ec824" class="flex justify-between">
      <a role="button" class="">Logback</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%A1%86%E6%9E%B6/logback/%E9%93%BE%E8%B7%AF%E8%B7%9F%E8%B8%AA/" class="">链路跟踪</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-f24d4c501fe67784f3fb93310a264e87" class="toggle"  />
    <label for="section-f24d4c501fe67784f3fb93310a264e87" class="flex justify-between">
      <a role="button" class="">My Batis</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%A1%86%E6%9E%B6/mybatis/mybatis/" class="">My Batis</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%A1%86%E6%9E%B6/mybatis/mybatis-plus/" class="">My Batis Plus</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-c87bd7e8a1ff6cfa0af3531a2e64a250" class="toggle"  />
    <label for="section-c87bd7e8a1ff6cfa0af3531a2e64a250" class="flex justify-between">
      <a role="button" class="">Spring生态</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%A1%86%E6%9E%B6/spring%E7%94%9F%E6%80%81/spring%E6%A1%86%E6%9E%B6/spring%E4%BA%8B%E5%8A%A1/" class="">Spring事务</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-49d6e82ce8262685ff4b61bdeeb7ab2b" class="toggle"  />
    <label for="section-49d6e82ce8262685ff4b61bdeeb7ab2b" class="flex justify-between">
      <a role="button" class="">源码阅读</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB/tomcat/%E6%9E%B6%E6%9E%84/" class="">架构</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB/tomcat/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/" class="">源码解析</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-a8655c41d6bd4e2cd795be8edc8487ea" class="toggle"  />
    <label for="section-a8655c41d6bd4e2cd795be8edc8487ea" class="flex justify-between">
      <a role="button" class="">网络通信</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1/httpclient%E5%8E%9F%E7%90%86/" class="">HTTP Client原理</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-702c4336f7edbbe316232a01ba26bf1a" class="toggle"  />
    <label for="section-702c4336f7edbbe316232a01ba26bf1a" class="flex justify-between">
      <a role="button" class="">Netty</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1/netty/netty%E5%8A%A0%E5%AF%86%E9%80%9A%E4%BF%A1/" class="">Netty加密通信</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1/netty/%E7%BB%84%E4%BB%B6%E4%BB%8B%E7%BB%8D/" class="">组件介绍</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-172c0280d72476b38f60281496fe5a12" class="toggle"  />
    <label for="section-172c0280d72476b38f60281496fe5a12" class="flex justify-between">
      <a role="button" class="">计算机网络知识</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E7%9F%A5%E8%AF%86/%E5%86%85%E7%BD%91%E8%8C%83%E5%9B%B4/" class="">内网范围</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-35d51e6393d8505594aceee6154f609d" class="toggle"  />
    <label for="section-35d51e6393d8505594aceee6154f609d" class="flex justify-between">
      <a role="button" class="">虚拟化</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E8%99%9A%E6%8B%9F%E5%8C%96/%E4%B8%80%E4%BA%9B%E6%A6%82%E5%BF%B5/" class="">一些概念</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-af6faafd3959904a690924dc37e37ba3" class="toggle"  />
    <label for="section-af6faafd3959904a690924dc37e37ba3" class="flex justify-between">
      <a role="button" class="">设计模式</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E6%9E%84%E5%BB%BA%E8%80%85%E6%A8%A1%E5%BC%8F/" class="">构建者模式</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F/" class="">策略模式</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-0559e84be42d6e9105d08b30db8452f5" class="toggle"  />
    <label for="section-0559e84be42d6e9105d08b30db8452f5" class="flex justify-between">
      <a role="button" class="">运维</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-040c9d5f9ffc134e7ce28abbbd637ab2" class="toggle"  />
    <label for="section-040c9d5f9ffc134e7ce28abbbd637ab2" class="flex justify-between">
      <a role="button" class="">K8s&amp;docker</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E8%BF%90%E7%BB%B4/k8sdocker/%E9%95%9C%E5%83%8F%E9%83%A8%E7%BD%B2/" class="">镜像部署</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E8%BF%90%E7%BB%B4/k8sdocker/%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4/" class="">相关命令</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-d5deec5b7f5c54da3ce283bd167f14b7" class="toggle" checked />
    <label for="section-d5deec5b7f5c54da3ce283bd167f14b7" class="flex justify-between">
      <a role="button" class="">随想</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E9%9A%8F%E6%83%B3/%E5%85%B3%E4%BA%8E%E5%81%9A%E4%BA%8B/" class="">关于做事</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E9%9A%8F%E6%83%B3/%E5%85%B3%E4%BA%8E%E5%85%A8%E5%B1%80%E6%80%A7%E4%BF%AE%E6%94%B9/" class="">关于全局性修改</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E9%9A%8F%E6%83%B3/%E5%85%B3%E4%BA%8E%E8%A7%A3%E8%80%A6/" class="">关于解耦</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E9%9A%8F%E6%83%B3/%E5%85%B3%E4%BA%8E%E9%9C%80%E6%B1%82%E4%BB%8E%E8%90%BD%E5%9C%B0%E5%88%B0%E5%AE%9E%E7%8E%B0%E7%9A%84%E6%B5%81%E7%A8%8B/" class="">关于需求从落地到实现的流程</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E9%9A%8F%E6%83%B3/%E6%97%A0%E6%A0%87%E9%A2%98/" class="active">无标题</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/information/public/docs/%E9%9A%8F%E6%83%B3/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E5%BF%83%E5%BE%97/" class="">问题解决心得</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-6c4d1e5fc6d4b822bcfdabbbded8c403" class="toggle"  />
    <label for="section-6c4d1e5fc6d4b822bcfdabbbded8c403" class="flex justify-between">
      <a role="button" class="">音视频</a>
    </label>
  

          
  <ul>
    
  </ul>

        </li>
      
    
  </ul>















</nav>




  <script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script>


 
      </div>
    </aside>

    <div class="book-page">
      <header class="book-header">
        
  <div class="flex align-center justify-between">
  <label for="menu-control">
    <img src="/information/public/svg/menu.svg" class="book-icon" alt="Menu" />
  </label>

  <strong>无标题</strong>

  <label for="toc-control">
    
    <img src="/information/public/svg/toc.svg" class="book-icon" alt="Table of Contents" />
    
  </label>
</div>


  
  <aside class="hidden clearfix">
    
  
<nav id="TableOfContents"></nav>



  </aside>
  
 
      </header>

      
      
  <article class="markdown book-article"><p>1.时序图只能表现出一个正常的交互流程，如果涉及到各种状态判断，或者说需要更细节的东西，还得考虑使用泳道活动图（流程图）</p>
<p>2.一个方法里面，如果代码业务逻辑复杂，不仅需要空行来分清代码逻辑，注释来解释代码，最好还是打点日志，方便部署后排查。日志的目的是为了项目部署后方便排查</p>
<p>3.traceId才是正确搜出完整调用链路耗时的方案。如果没有traceId，先通过某关键字搜日志，拿到traceId后再通过traceId来搜</p>
<p>4.一个方法入口记得打印参数，方便排查问题，如定位该方法或者通过以该参数为关键字，找出该条链路的traceId</p>
<p>5.WebRTC传输层协议大多使用UDP</p>
<p>WebSokcet的传输层协议大多使用TCP来实现全双工通信，本质是基于Http建立了一个Tcp连接</p>
<p>6.管理系统最终的本质都是增删改查。一个管理系统，往往是在增删改查的基础上，围绕了大量的复杂业务，增删改查的背后是一系列负责的业务，但是这些业务的结果，最终都会以对数据的增删改查投影在数据库</p>
<p>7.技术是技术，业务是业务，技术应该是通用的，业务的私有的，技术不服务于业务，技术可用于业务，技术与业务是解耦的</p>
<p>8.系统分析流程与公司实践对比</p>
<table>
<thead>
<tr>
<th>规范系统分析与设计流程（维度是系统）</th>
<th>辅助工具</th>
</tr>
</thead>
<tbody>
<tr>
<td>获取业务用例及分析业务用例场景</td>
<td>业务用例图及泳道活动图（描述用户之间的交互）</td>
</tr>
<tr>
<td>提取系统用例及分析系统用例场景</td>
<td>系统用例图及泳道活动图（描述用户与计算机之间的交互）</td>
</tr>
<tr>
<td>实现系统用例场景及获取分析类图</td>
<td>时序图与分析类（边界类，实体类，控制类等）</td>
</tr>
<tr>
<td>系统架构设计及获取系统用例分析模型</td>
<td>基于架构的时序图及分析类图（边界类，实体类，控制类）</td>
</tr>
<tr>
<td>分析模型映射到设计模型</td>
<td>实体类图</td>
</tr>
<tr>
<td>接口及包设计</td>
<td>类图</td>
</tr>
<tr>
<td>数据模型设计</td>
<td>实体关系图（ERD）</td>
</tr>
<tr>
<td>系统实现</td>
<td>代码开发</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>公司方案模板（需求维度，即系统用例维度）</th>
<th>辅助工具</th>
</tr>
</thead>
<tbody>
<tr>
<td>背景</td>
<td>纯文字描述</td>
</tr>
<tr>
<td>目标</td>
<td>纯文字描述</td>
</tr>
<tr>
<td>需求分析，确定需求范围（提取系统用例，确定系统用例范围）</td>
<td>纯文字描述（系统用例图）</td>
</tr>
<tr>
<td>问题分析（系统用例实现，关键细节的方案处理）</td>
<td>纯文字描述</td>
</tr>
<tr>
<td>场景分析（系统用例场景分析）</td>
<td>纯文字描述（活动泳道图）</td>
</tr>
<tr>
<td>流程设计（系统用例实现）</td>
<td>时序图（描述前后端或者模块之间的交互图）</td>
</tr>
<tr>
<td>异常场景设计</td>
<td>纯文字描述</td>
</tr>
<tr>
<td>数据模型设计</td>
<td>SQL语句（或者加上ERD图）</td>
</tr>
<tr>
<td>接口设计</td>
<td>接口文档（YAPI）</td>
</tr>
<tr>
<td>性能评估</td>
<td></td>
</tr>
<tr>
<td>业务影响范围（需求影响范围）</td>
<td></td>
</tr>
<tr>
<td>安全性评估</td>
<td></td>
</tr>
<tr>
<td>评审意见</td>
<td></td>
</tr>
</tbody>
</table>
<p>一：online-server(SpringBoot项目)：SpringBoot集成netty（服务端），利用kafka解耦业务通信</p>
<p>1.非web环境，只是一个springBoot项目，所以利用countDownLatch来使项目一直处于启动状态。latch不countDown,一直await就可以</p>
<p>2.该SpringBoot项目，通过SpringApplicationBuild的方式构建容器上下文，该方法可自定义多种启动配置，如不需要web环境，是一种更灵活的启动方式。惯用做法是SpringApplication.run（启动类，启动参数），该做法启动一个web项目，项目会一直处于运行状态（启动了Tomcat）。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#66d9ef">new</span> SpringApplicationBuilder().<span style="color:#a6e22e">web</span>(WebApplicationType.<span style="color:#a6e22e">NONE</span>).<span style="color:#a6e22e">sources</span>(启动类).<span style="color:#a6e22e">args</span>(启动参数)
</span></span></code></pre></div><p>3.kafka有个专门的消费者订阅netty启动/关闭主题，该消费者控制netty的启动与关闭。（此种设计，使得该项目与netty服务解耦，可以随时关闭/开启netty服务，而不要启动/关闭整个服务）</p>
<p>3.1 另外一种启动方式：Netty启动类实现Spring的InitializingBean，实现其afterPropertiesSet（）方法，在bean初始化完后自动启动(这种方式只能启动，不能停止，除非整个SpringBoot服务挂了)</p>
<p>（一个SpringBoot项目可以启动多个Netty服务）</p>
<p>4.Netty服务端的所有组件都加入spring容器，由spring管理</p>
<p>5.服务器向客户端通信，通过kafka进一步解耦。发送消息的Service为kafak消费者，其他下游服务通过往该topic发送数据，该消费者即会将对应的数据发送到客户端，其他微服务与云机的通信问题</p>
<p>6.服务端收到消息后，通过kafka将消息下发到下游，由对应的微服务进行处理</p>
<p>7.服务端接收到客户端信息后，通过自定义的解码器解码字节数组（字节数组实际就是一串二进制码），自定义的解码器有json解码与gzip解码。前者调用的实际就是FastJsonSerializer.deserialize(byte[])。解码器写死了解码的数据格式，也就是自定义的实体类。编码适配器调用JSON.toJSONByte()将对象转成jons字节数组</p>
<p>这里用了对象适配器模式，遍历存储了解码器的数组，从数组中获取对应的解码适配器，解码适配器再调用对应的对象反序列化数据。实际就是在数据源与解码器之间，加了一层适配器</p>
<p>8.锁获取锁失败有两种方案：通过时间停止获取锁，如超过等待时间就停止获取锁；通过获取次数，如果获取次数超高预期值，则停止获取锁</p>
<p>9.对接第三方平台，向第三方平台发送请求时，需要记录第三方接口的响应时间。可以将调用操作记录入口，记录请求时间，响应时间，花费时间，请求参数等信息，方便排查性能问题</p>
</article>
 
      

      <footer class="book-footer">
        
  <div class="flex flex-wrap justify-between">





</div>



  <script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script>


 
        
      </footer>

      
  
  <div class="book-comments">

</div>
  
 

      <label for="menu-control" class="hidden book-menu-overlay"></label>
    </div>

    
    <aside class="book-toc">
      <div class="book-toc-content">
        
  
<nav id="TableOfContents"></nav>


 
      </div>
    </aside>
    
  </main>

  
</body>
</html>












